package cl.loso.melon.server.servlet;

import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.appengine.api.datastore.Entity;
import cl.loso.melon.server.persistencia.MetaLVSDAO;
import cl.loso.melon.server.util.Util;

public class CalculaMetaHomeServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static Log logger = LogFactory.getLog(CalculaMetaHomeServlet.class);

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		try {

			Util.deleteEntities("RepoHome");
			Date fecha_ini, fecha_ter;

			fecha_ini = Util.getPrimerDiaDelAno();
			fecha_ter = Util.getUltimoDiaDelAno();
			
			calculaDuracionVisita(fecha_ini, fecha_ter, "tabla1");

			fecha_ini = Util.getPrimerDiaDelMes(0);
			fecha_ter = Util.getUltimoDiaDelMes(0);

			calculaDuracionVisita(fecha_ini, fecha_ter, "tabla2");

			fecha_ini = Util.getPrimerDiaDelMes(-1);
			fecha_ter = Util.getUltimoDiaDelMes(-1);

			calculaDuracionVisita(fecha_ini, fecha_ter, "tabla3");

			fecha_ini = Util.getPrimerDiaDelMes(-2);
			fecha_ter = Util.getUltimoDiaDelMes(-2);
			
			calculaDuracionVisita(fecha_ini, fecha_ter, "tabla4");

		} catch (Exception e) {
			logger.error(e.getMessage());
		}
	}

	private void calculaDuracionVisita(Date fecini, Date fecfin, String tabla) {
		Iterable<Entity> negocios = Util.listAllEntities("NegocioLVS");
		double total_horas = 0;
		double total_meta = 0;
		double total_cumplimiento = 0;
		for (Entity negocio : negocios) {
			Iterable<Entity> visitas = Util.listEntities3("VisitaLVS",
					"negocio", negocio.getKey().getId(), fecini, fecfin);
			long tduracion = 0;
			double horas = 0;
			double cumplimiento = 0;
			for (Entity visita : visitas) {
				tduracion = tduracion
						+ ((Long) visita.getProperty("duracion")).longValue();
			}

			horas = (double) tduracion / 3600000;

			total_horas = total_horas + horas;

			int metita = calculaMetaNegocio(negocio.getKey().getId(), fecini,
					fecfin);

			total_meta = total_meta + metita;

			if (metita != 0) {

				cumplimiento = (double) horas / (double) metita;
			} else {
				cumplimiento = 0;
			}

			Entity reporte = new Entity("RepoHome");
			reporte.setProperty("tabla", tabla);
			reporte.setProperty("negocio", negocio.getProperty("nombre"));
			reporte.setProperty("duracion", (int)Math.round(horas));
			reporte.setProperty("meta", metita);
			reporte.setProperty("avance", (int)Math.round(cumplimiento*100));
			Util.persistEntity(reporte);
		}
		
		total_cumplimiento=total_horas/total_meta;
		
		Entity reporte = new Entity("RepoHome");
		reporte.setProperty("tabla", tabla);
		reporte.setProperty("negocio", "Total");
		reporte.setProperty("duracion", (int)Math.round(total_horas));
		reporte.setProperty("meta", (int)total_meta);
		reporte.setProperty("avance", (int)Math.round(total_cumplimiento*100));
		Util.persistEntity(reporte);

	}

	private int calculaMetaNegocio(Long idNegocio, Date fecini, Date fecfin) {
		Iterable<Entity> usuarios = Util.listEntities2("UsuarioLVS", "negocio",
				idNegocio);
		int meta = 0;
		for (Entity usuario : usuarios) {
			meta = meta
					+ MetaLVSDAO.obtenerTotalMeta(fecini, fecfin, usuario
							.getKey().getId());
		}
		return meta;
	}
}
